const path = require('path');

const cors = require('cors');

const express = require('express');
const app = express();
app.listen(3007, () => console.log('大事件服务器启动了'));


// ----------  加载路由模块之前，设置应用级别的中间件
// 解决跨域
app.use(cors());
// 接收 urlencoded 类型的请求体
app.use(express.urlencoded({extended: false}));
// 开放静态资源（uploads）uploads 文件夹要放上传的图片
app.use(express.static('uploads'));

// 使用express-jwt模块，控制 以 /my 开头的接口，需要正确的token才能访问
const expressJWT = require('express-jwt');
// 下面一行代码的意思是，除了以 /api 开头的接口，其他所有接口都需要身份认证才能访问
app.use(  expressJWT({ secret: 'bigevent-9760' }).unless({path: /^\/api/})  );
// 模拟express-jwt 内部错误的处理方式 --> 将错误对象，通过next()，传递到后面。这样就允许我们使用错误中间件统一来处理错误
// app.use((req, res, next) => {
//     try {

//     } catch (e) {
//         next(e);
//     }
// });

// ---------- 加载路由模块，并注册成中间件
app.use('/api', require(path.join(__dirname, 'routers', 'login')));
app.use('/my/article', require(path.join(__dirname, 'routers', 'category')));
app.use('/my/article', require(path.join(__dirname, 'routers', 'article')));
app.use('/my', require(path.join(__dirname, 'routers', 'user')));

// 错误中间件，统一处理tokne的问题
app.use((err, req, res, next) => {
    // 真的token问题，做判断
    if (err.name === 'UnauthorizedError') {
        console.log(err.message);
        res.json({
            status: 1,
            message: '身份认证失败！'
        });
    }
});